# 4.1 识别颜色

## 4.1.1 算法简介

![1](./media/1.png)

指定一个或多个识别区域，其位置和大小可根据需要进行设置，返回该区域的颜色标签以及红色分量值R、绿色分量值G与蓝色分量值B。

---------------------

## 4.1.2 颜色分类标签

Sengo2定义了7 种颜色的分类标签：

| 标签值 | 含义 | 标签值 | 含义 |
| :----: | :--: | :----: | :--: |
|   1    | 黑色 |   2    | 白色 |
|   3    | 红色 |   4    | 绿色 |
|   5    | 蓝色 |   6    | 黄色 |
|   0    | 未知 |        |      |

<span style="color:red;font-size:20px;">注：不在表格中的常见的颜色如紫色、青色（蓝绿色）、橙色、灰色等，其颜色区分度较低，容易误识别为表格中的颜色， 因此这几种颜色被归为未知颜色。如若需要识别以上颜色，可根据返回的RGB分量值自行进行判定。</span>

示例1：

![2](./media/2.png)

串口标签值输出为：（可以看到5个识别框输出的颜色标签值都为3，与表格中的标签值对应）

![](./media/a24.png)

示例2：

![3](./media/3.png)

串口标签值输出为：（可以看到前两个识别框对应红色，中间识别框对应白色，最后两个识别卡对应绿色，而输出的标签值也与表格对应）

![](./media/a25.png)

-------------------------

## 4.1.3 代码块介绍

1. ![a13](./media/a13.png)块，用于设置Sengo2的通信方式的，点击`端口`后方可以选择`I2C`,`Serial`,`Serial2`

2. ![a14](./media/a14.png)块，用于设置运行AI视觉模块的功能代码，点击`算法`后方可以选择想要的功能：`颜色识别`,`色块检测`,`标签识别`,`线条检测`,`深度学习`,`卡片识别`,`人脸识别`,`20类物体`,`二维码`,`运动物体`

3. ![a15](./media/a15.png)块，用于设置`颜色识别`与`色块`功能模式下，参数组（比如你想识别两个不一样的颜色那边就要将参数组设置成2)
4. ![a16](./media/a16.png)块，用于设置识别区域坐标和识别框的大小，如未指定新的参数，则以默认值运行，参数定义如下：

|    参数    |               含义                | 默认值 |
| :--------: | :-------------------------------: | :----: |
| 中心横坐标 |        识别区域中心横坐标x        |   50   |
| 中心纵坐标 |        识别区域中心纵坐标y        |   50   |
|    宽度    |           识别区域宽度w           |   3    |
|    高度    |           识别区域高度h           |   4    |
|   参数组   | 用于区分多个识别区进行标注（1-5） |   1    |

5. ![a17](./media/a17.png)块，用于各个功能模式下返回AI视觉模块识别到的结果数量
6. ![a18](./media/a18.png)块，用于返回识别到的颜色标签值（对应`4.1.2 颜色分类标签`中的表)，当多个标签时需要使用`result`进行区分
7. ![a27](./media/a27.png)块，用于判断是否检测到设置好的颜色，如果有检测到则返回1，没有则返回0

--------------------

## 4.1.5 识别颜色算法使用技巧

1. 当识别区域较小时，譬如2x2，虽然识别速度快，但因像素点过少，结果易被干扰，其可信度较低，只适用于背景单一可控的应用场合；

2. 当识别区域较大时，譬如20x20，因像素点多，区域内杂色的干扰被会滤除，结果具有较高的可信度，但识别速度慢；

3. 当识别区域内不同颜色的面积相当时，结果可能会反复跳变；

-----------------------

## 4.1.6 代码

1. 在代码启动中设置串口波特率为`9600`，然后设置AI视觉模块的通信方式为`I2C`，再设置AI视觉模块运行`颜色识别`模式

![a19](./media/a19.png)

2. 再设置AI视觉模块识别的参数组为5（也就是设置了5个识别区），然后分别将这5个识别区进行设置位置以及大小还有参数，我将5个识别区排成一排并设置大小从左边逐渐变大（注意后面的参数组值是从1-5的）

![a20](./media/a20.png)

3. 使用判断模块对检测数量进行判断，只有检测数量大于0时才进行颜色标签值的输出

![a21](./media/a21.png)

4. 定义一个名为item的局部变量并设置初始值为1，因为我们有5个识别框所以我们用循环模块进行5次循环，我们再循环内使用串口对返回标签值进行不换行打印并再每次打印结束后变量item的值加1，循环结束后打使用换行打印是下一次的值换行打印。

![a22](./media/a22.png)



**完整代码：**

![a23](./media/a23.png)

----------------

## 4.1.7 代码结果

上传代码后，AI视觉模块上将出现5个大小不一样的识别框，每个识别框都会对它所代表的框中的颜色，然后通过串口监视器打印识别到颜色对应的标签值。

![4](./media/4.png)

![](./media/a26.png)

## 4.1.8 扩展玩法

**颜色密码锁**

- **玩法简介：** 设定一个颜色序列作为“密码”（如：红-蓝-绿）。只有按正确顺序向摄像头展示相应颜色，才能触发成功信号（如舵机转动、灯亮）。
- **实现：** 编程记录短时间内识别到的颜色序列。只有序列与预设的“密码”完全匹配时，才执行解锁动作。这可用来打开一个简单的盒子或启动一个设备。